object Demo09Func3 {
  // 以函数作为参数 应用
  def main(args: Array[String]): Unit = {
    // 创建一个Array
    val arr: Array[Int] = Array[Int](1, 2, 3, 4, 5, 6, 7)
    val arrStr: Array[String] = Array[String]("1", "2", "3", "4")

    // 遍历arr

    // Java的风格
    /**
     * for 循环
     * for(int i=0;i<arr.length;i++){
     * System.out.println(arr[i]);
     * }
     * 增强for
     * for (Int i : arr){
     * System.out.println(arr[i]);
     * }
     */

    // Scala中的for循环 类似Java中的增强for、Python中的for循环
    for (i <- arr) {
      println(i)
    }
    println("*" * 20)
    // 从1打印到5
    for (i <- 1 to 5) {
      println(i)
    }
    // 左闭右开
    for (i <- 1 until 5) {
      println(i)
    }

    // 类似Python中Range 左闭右开
    for (i <- Range(1, 5, 1)) {
      println(i)
    }

    println("*" * 20)




    // Scala的风格

    /**
     * println是一个什么类型的函数？
     * Any => Unit
     *
     * foreach 函数需要接收一个 “参数为Int，返回值类型为Unit（Int=>Unit）”的函数
     */

    def printStr(str: String): Unit = {
      println(str)
    }

    arr.foreach(println)

    //    arr.foreach(printStr) // 函数类型不匹配

    arrStr.foreach(println)

    arrStr.foreach(printStr)

    println("#" * 30)
    // 对arr中的每一个元素扩大2倍 并获得一个新的Array数组

    // Java的风格
    val arrLength: Int = arr.length
    var i: Int = 0

    // 创建一个长度同arr的一个新的数组
    val newArr: Array[Int] = new Array[Int](arrLength)

    while (i < arrLength) {
      newArr(i) = arr(i) * 2
      i = i + 1
    }

    // mkString方法是将Array中的每个元素与指定的分隔符进行拼接的到一个字符串
    println(newArr.mkString("|"))

    // Scala的风格

    /**
     * map方法
     * 需要接收一个函数f： Int => B (自定义，函数f返回什么类型没有明确的规定，返回什么就是什么)
     *
     * map VS foreach
     * 有无返回值
     */

    def f1(i: Int): Int = {
      i * 2
    }

    val newArr2: Array[Int] = arr.map(f1)

    println(newArr2.mkString(","))
    // 使用匿名函数进行简化
    println(arr.map(_ * 2).mkString(","))
    println(arr.map(_ * 3).mkString(","))
    println(arr.map(_ * 4).mkString(","))


  }

}
